3T_SMS 발송 API를 이용한 문자 메시지 발송하기

  • API Client 프로그램을 이용해서 할 예정
  • 유료 / 무료 (유료 중에서는 Python 코드로 변환해주는 프로그램도 있다.)
  • 우리가 오늘 쓸 것은 무료 => Postman (Chrome Extension)
  • requests.get(...) 주로 get 아니면 post. get이 주소를 받아오는 것을 알았다.
  • requests.post(...) post로 보내는 곳도 있다.
  • GET, POST, ( HTTP METHOD) ( EX: GET, POST, HEAD, OPTIONS, PUT, PATCH, DEL ...)
  • HTTP Method 라고 부른다. 주로 쓰는 것은 get or post
  • => 클라이언트가 서버로 데이터를 전송하는 방식 ( GET / POST)
  • GET 방식은 쿼리를 통해서 불러들이는 방식. html의 input안에 쿼리(key)라는 부분 안에 value를 넘김으로써 받아들이는 과정
    • => url을 통해서 데이터를 전송하는 방식(지금까지 크롤링 방식. ex_page, query, per = 1, "프로듀스 101", 50)
  • POST는 url을 안통하고 http body 안에 데이터를 전송하는 것. 로그인(id, pw)이 대표적인 예
    • JSON은 직방처럼 GET일수도 있고 POST일 수도 있다.
  • 두 개 중에서 뭘 쓰냐가 정답은 아니지만
  • 관례적으로 (RESTful API; restful한 구현에서 )
    • GET => 리소스를 받아올 때 사용(검색, 리스트, 상세보기)
    • Post => 리소스를 추가할 때 사용(로그인, 회원가입, 글쓰기, 문자메시지 보내기)
    • PUT/PATCH => 리소스를 업데이트 할 때(회원 정보 수정)
    • DELETE => 리소스가 지워질 때(글 삭제; 즐겨찾기에서 제거)
  • 문자메세지는 requests.get이 아니라 => requests.post로 할거야

postman 어플에 접속해서 양식에 맞추어서 작성한 후 노트보고 공부하기


In [2]:
import requests

def send_sms(send_phone, dest_phone, content, subject=None):
    base_url = "http://api.openapi.io/ppurio/1/message/sms/dobestan"

    headers = {
        'x-waple-authorization': 'MTkyMC0xNDEzODU0NTAwMzU3LTllM2VkOTM3LTYwMTEtNGU2Zi1iZWQ5LTM3NjAxMTNlNmYyMg==',
    }

    payload = {
        'send_phone': send_phone, 
        'dest_phone': dest_phone,
        'msg_body': content,
        'subject': subject,
    }

    response = requests.post(
        base_url,
        data=payload,
        headers=headers,
    )
    
    return response


def send_sms_myself(content):
    MY_PHONE_NUMBER = "01022205736"
    return send_sms(MY_PHONE_NUMBER, MY_PHONE_NUMBER, content)

In [3]:
# 1. SMS 발송 함수 => Decorator
# 2. Slack API => Message

In [4]:
import time
import datetime

def sms(function):
    def wrapper(*args, **kwargs):
        name = function.__name__
        current_time = str(datetime.datetime.now())
        send_sms_myself("{name} function 을 실행합니다. - {time}".format(name=name, time=current_time))
        result = function(*args, **kwargs)
        
        current_time = str(datetime.datetime.now())
        send_sms_myself("{name} function 이 성공적으로 끝났습니다. - {time}".format(name=name, time=current_time))
    return wrapper

In [5]:
@sms
def crawling():
    time.sleep(3)

@sms
def preprocess():
    time.sleep(5)
    

def start():
    crawling()
    preprocess()

In [6]:
start()
#크롤링이 시작됐다가 다 끝나면 전처리가 시작됨

In [7]:
from datetime import timezone
from datetime import datetime
datetime.now()   # UTC ( UTC+9 )


Out[7]:
datetime.datetime(2016, 8, 25, 12, 58, 1, 676121)

In [8]:
#이제 Slack으로 들어와서. 팀 만들고. app추가해서. incoming webhooks 추가
#그 채널 안에 만들고 URL 복붙하기

import requests
import json

def send_slack(channel, username, icon_emoji, message):
    base_url = "https://hooks.slack.com/services/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"

    payload = {
        "channel": channel,
        "username": username,
        "icon_emoji": icon_emoji,
        "text": message,
    }

    response = requests.post(
        base_url,
        data=json.dumps(payload),
    )
    
    return response

In [9]:
send_slack("#dss", "kk", ":slack", "안녕하세요").content
#한글 적어도 json 덤프스가 해줄 것이기 때문에 괜찮다.


Out[9]:
b'ok'

In [10]:
# HTTP Method ( GET, POST ) : 서버에 데이터를 전송하는 방식
# 반대로 서버가 클라이언트한테 주는 정보가 있다.
# status_code 
# 1XX ...
# 2XX Successful ( 200 OK; 201 CREATED; )
# 3XX Redirect
# 4XX Failed => 서버에서는 정상적으로 문제없이 돌아가는데 => 뭔가 너가 보낸 정보가 이상하다
# 5XX Server Error ( Internal Server Error )

In [11]:
# 밑에 내용을 해볼 것
# Gmail => API 형태로 메일을 보낼 수가 있습니다. 
# Gmail...
# 강사님 자주 쓰는 것. SMS, Slack, Email(Gmail => Mailgun...)

In [12]:
# 주말 동안 해 볼 것
# @sms 단, 데코레이터를 써서
# @slack
def crawling(keyword):
    # 키워드를 받아서 그 키워드에 대한 네이버 중고나라 크롤링
    # 결과로 dict, list 등의 데이터를 전달
    pass

# @sms
# @slack
def preprocess(data):
    # 받아온 데이터에서 의미 있는 정보만 뽑아내는거 => 휴대폰(전처리), 첫 번째 이미지 등 
    # 을 뽑아 와서 csv 파일로 저장
    pass

# 크롤링, 전처리를 하나의 사이클 ( + SMS, Slack )

# 다음주 Pandas, Numpy ( 9H = 4H + 5H )
# 다다음주 Pandas ... => DB ( SQL )(20H) => 16H(SQL+Pandass) + 4H
#  => SQL, Pandas ( Y/n )
#  => 관계형 Database ( RDBS ) => MongodDB ( Non-관계형 )

In [ ]: